package day230328;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/3/29 20:28
 * 不使用算数运算符计算 A + B
 */
public class UnusualAdd {

    public static void main(String[] args) {
        UnusualAdd unusualAdd = new UnusualAdd();
        System.out.println(unusualAdd.addAB(1, 3));
        System.out.println(unusualAdd.addAB(7, 3));
        System.out.println(unusualAdd.addAB(10, 3));
    }

    // 返回 A + B 的值
    public int addAB(int A, int B) {
        // 不考虑进位的情况下 A + B = A ^ B
        // 若考虑进位 则 进位需要表示成 carry = (A & B) << 1
        // 如果进位为 0 , 则不需要累加
        int res = A ^ B; // 结果用 res 表示
        int carry = (A & B) << 1; // carry 表示进位
        // 如果发生进位, 需要对结果和进位进行累加, 并不断更新 carry
        while (carry != 0) {
            int temp = res; // 记录 res 旧值, 用于判断累加后是否发生进位
            res ^= carry;
            carry = (temp & carry) << 1;
        }
        return res;
    }
}
